package com.example.rpc.util;

import com.example.rpc.anno.RpcClass;

import java.io.File;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @description:
 * @author: RockyZZB
 * @time: 2020/12/21 21:48
 */
public class AnnoUtil {
    /**
     * 传入参数一个包名
     * 得到所有业务类,得到文件名
     * 通过反射得到一个类
     * 解析类有没有加注解
     * 解析方法有没有加注解
     * 把此包下的此类的此方法发布出去
     */
    public static Map<String,List<Map<String,List<String>>>> paraseAnno(String packageName) throws ClassNotFoundException {
        Map<String,List<Map<String,List<String>>>> map=new HashMap<>();
        String basePath = AnnoUtil.class.getResource("/").getPath();
        String replace = packageName.replace(".","/");
        File file=new File(basePath+replace);
        String[] names=file.list();
        for (String name:names){
            name=name.replace(".class","");
            Class<?> clazz=Class.forName(packageName+"."+name);
            if (clazz.isAnnotationPresent(RpcClass.class)){
                Map<String,List<String>> method=new HashMap<>();
                Method[] declaredMethods = clazz.getDeclaredMethods();
                List<Map<String,List<String>>> methods=new ArrayList<>();
                for (Method declareMethod:declaredMethods){
//                    if (declareMethod.isAnnotationPresent(RpcMethod.class)){
                        List<String> parames=new ArrayList<>();
                        Class<?>[] parameterTypes=declareMethod.getParameterTypes();
                        for (Class<?> paramType:parameterTypes){
                            parames.add(paramType.getSimpleName());
                        }
                        method.put(declareMethod.getName(),parames);
                        methods.add(method);
//                    }
                }
                map.put(packageName+"."+name,methods);
            }
        }
        return map;
    }
}
